热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android中属性和target属性分析

1.概要<uses-sdk>用来描述该应用程序可以运行的最小和最大API级别,以及应用程序开发者设计期望运行的平台版本。通过在manifest清单文件中添加该属性,
1. 概要 

 

 用来描述该应用程序可以运行的最小和最大API级别,以及应用程序开发者设计期望运行的平台版本。通过在manifest清单文件中添加该属性,我们可以更好的控制应用在不同android 系统版本上的安装和兼容性体验问题。

                                                                                   

       (图 1)

    如上图所示,通过minSdkVersion,targetSdkVersion,maxSdkVersion三个属性对应用安装兼容性方面进行控制。下面我们依次对这三个属性进行详细介绍。

 
  2. minSdkVersion
 

该属性的作用主要体现在两个阶段,一个是在应用安装时,一个是在项目构建时。

 

     2.1. 安装时作用

               当安装应用的手机系统API level 小于 minSdkVersion的值时,将不能安装该应用。 

       minSdkVersion 用于指明应用程序运行所需的最小API level。如果不指明该属性,其默认值为1。如上图1中minSdkVersion =“8”,说明该应用在只能安装在大于等于android系统API level 为8(android2.2)的系统上。如果将该应用安装在API level 小于8的android系统上,系统会提示手机API level的版本太低,安装失败。 

所以这里有一点需要引起我们注意,我们在开发时必须留意我们用到API 接口的版本。在定义minSdkVersion属性时,尽量要让minSdkVersion的值大于等于我们用到的API 接口的开始被支持的最低版本。这样可以让不支持该接口的android系统不能安装我们的应用,防止应用在一些手机上因兼容性问题而崩溃。

 

      2.2.构建项目时作用

 

       在程序中如果我们用到了高于minSdkVersion的值的API接口,Eclipse会自动报错提醒开发者。这里我们以getActionBar()这个接口为例,这个接口是在android 3.0(API leve 11)中出现的。我们通过设置minSdkVersion的值来查看程序中开发工具(Eclipse)对程序的检测。

 

 

  • 如下图minSdkVersion = 8时,我们调用API level 为13的接口时Eclipse会自动报错提示开发者:

 

 
 
 
 

这里我们可以通过Eclipse 的修复提示选择Add@SuppressLIne “NewApi” 来对付编译错误,但是并不建议这样解决问题。这样虽然躲过了编译报错,能成功编译出apk文件,但是如果在低于android 3.0(API leve 13)系统的手机上安装该应用后运行可能就会出现程序崩溃现象(高于android 3.0(API leve 13)系统的手机上安装运行正常)。对于一个app来说与其在手机上出现崩溃,不如不让用户安装这个应用(个人观点),当然这里需要综合考虑新api的调用频率和场景进行综合判段。

这里采用Eclipse 的@SuppressLint(“NewApi”)方法防止报错提示。

                                 

 


在android 2.3(API level 9)系统上安装后运行时,应用出现崩溃现象。

 

 

 

  • 这时我们可以考虑能用修改minSdkVersion的值来解决该问题,我们将minSdkVersion的值设置为11。
 
 
 
 

 一切正常没有报错。这时在android系统版本小于android 3.0(API level 11) 时安装该应用时将不能安装;在android系统3.0以上正常安装运行。

 

2.3. 总结

从上面两点中我们已经看到了minSdkVersion的重要性。minSdkVersion不仅在程序安装时起作用,也会在项目构建时起作用。我们应该充分利用它的这两个作用,谨慎的设置其值,保证应用不会因为接口兼容问题在一些手机上运行时崩溃影响用户体验。

 

3. maxSdkVersion

      标明可以运行你的应用的最高API Level版本。现在Google官方文档中已经建议不推荐使用这个属性了。

在android 1.5,1.6,2.0和2. 0. 1系统上安装应用或系统升级时,系统会检查这个值。在这两种情况下,如果应用设置的maxSdkVersion 值低于系统本身使用的API Level,系统将不会允许安装该应用;在系统升级后,新系统会重新校验这个值,如果新系统的API Level高于这个值,新系统会删除你的应用。在android 2. 0. 1(API level 6)系统后该属性作用已经失效,也建议不在使用该属性。

例如:

 

 

在android 2.3(API level  9)上安装该应用时,从下图可以看出maxSdkVersion 已经没有效果了,当系统API level大于maxSdkVersion也照样能安装该应用。

 

新版本系统基本上是完全兼容以前的老版本的,没有必要设置这个属性去阻止你的应用在新版本上安装;另外,如果你指定了这个属性,用户手机系统升级可能会删掉你的应用。所以这个属性完全没有必要设置的了,这可能也是Google推荐不再使用的原因吧。

 

4. targetSdkVersion

 

 

这个属性会告诉系统该应用已经在API level 为targetSdkVersion值的系统上进行了充分测试,如果系统的API level 和当前应用的targetSdkVersion一样,系统将不会启用兼容模式运行该应用,如果不设置其默认值将等于minSdkVersion的值。

如果平台的API Level高于你的应用程序中的targetSdkVersion属性指定的值,系统会开启兼容行为来确保你的应用程序继续你期望的形式来运行。例如,设置这个targetSdkVersion值为11或更高,当你的应用运行在Android3.0或更高的系统上时,系统会自动为你的应用使用新的默认主题(Holo主题),并且当运行在大屏幕的设备上时会禁用屏幕兼容模式(screen compatibility mode),因为支持了 API level11就暗示了支持大屏幕。一般情况下,应该将这个属性的值设置为最新的API level 值,这样的话就可以充分利用新版本系统上的新特性。Eclipse在生成项目时,默认将该值设置为最高。

 

Android版本更新时添加新特性详见:

http://developer.android.com/reference/android/os/Build.VERSION_CODES.html

如果平台的API Level低于你的应用程序中的targetSdkVersion属性指定的值时, 系统会开启兼容行为来确保你的应用程序能正常运行,这时一些在targetSdkVersion上的特性就没有了。但是,这个设置仅仅是一个声明、一个通知,在低版本系统中运行不会有太实质的作用。比如:使用了targetSdkVersion这个SDK版本中的一个特性,但是这个特性在低版本中是不支持的,那么在低版本的API设备上运行程序时,可能会报错:java.lang.VerifyError。也就是说,此属性不会帮你解决兼容性的测试问题。你至少需要在minSdkVersion这个版本上将程序完整的跑一遍来确定兼容性是没有问题的。

 

从上面的论述可知,targetSdkVersion这个属性是在程序运行时期起作用的,系统根据这个属性决定要不要以兼容模式运行这个程序。

 

5. target

 

Android工程中还有个target属性,这个属性位于Android工程根目录下project.properties中,从名字来看很容易将其功能和targetSdkVersion混淆。

 

                                        

               

其实他们的功能大相径庭:

 

 

 

  •   targetSdkVersion这个上面已经做过分析,在程序运行时起作用,系统根据这个属性决定要不要以兼容模式运行这个程序。
  •  project.properties中的target是指在编译的时候使用哪个版本的API进行编译。它和工程下导入的api包的API Level保持一致的。如果你更改target的值,上面的api包会跟着变化,你更改api包时target的值也会变化。

 


推荐阅读
  • 解决Only fullscreen opaque activities can request orientation错误的方法
    本文介绍了在使用PictureSelectorLight第三方框架时遇到的Only fullscreen opaque activities can request orientation错误,并提供了一种有效的解决方案。 ... [详细]
  • Android中将独立SO库封装进JAR包并实现SO库的加载与调用
    在Android开发中,将独立的SO库封装进JAR包并实现其加载与调用是一个常见的需求。本文详细介绍了如何将SO库嵌入到JAR包中,并确保在外部应用调用该JAR包时能够正确加载和使用这些SO库。通过这种方式,开发者可以更方便地管理和分发包含原生代码的库文件,提高开发效率和代码复用性。文章还探讨了常见的问题及其解决方案,帮助开发者避免在实际应用中遇到的坑。 ... [详细]
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • 在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ... [详细]
  • Android 构建基础流程详解
    Android 构建基础流程详解 ... [详细]
  • MATLAB字典学习工具箱SPAMS:稀疏与字典学习的详细介绍、配置及应用实例
    SPAMS(Sparse Modeling Software)是一个强大的开源优化工具箱,专为解决多种稀疏估计问题而设计。该工具箱基于MATLAB,提供了丰富的算法和函数,适用于字典学习、信号处理和机器学习等领域。本文将详细介绍SPAMS的配置方法、核心功能及其在实际应用中的典型案例,帮助用户更好地理解和使用这一工具箱。 ... [详细]
  • 在Ubuntu系统中安装Android SDK的详细步骤及解决“Failed to fetch URL https://dlssl.google.com/”错误的方法
    在Ubuntu 11.10 x64系统中安装Android SDK的详细步骤,包括配置环境变量和解决“Failed to fetch URL https://dlssl.google.com/”错误的方法。本文详细介绍了如何在该系统上顺利安装并配置Android SDK,确保开发环境的稳定性和高效性。此外,还提供了解决网络连接问题的实用技巧,帮助用户克服常见的安装障碍。 ... [详细]
  • 今天我开始学习Flutter,并在Android Studio 3.5.3中创建了一个新的Flutter项目。然而,在首次尝试运行时遇到了问题,Gradle任务 `assembleDebug` 执行失败,退出状态码为1。经过初步排查,发现可能是由于依赖项配置不当或Gradle版本不兼容导致的。为了解决这个问题,我计划检查项目的 `build.gradle` 文件,确保所有依赖项和插件版本都符合要求,并尝试更新Gradle版本。此外,还将验证环境变量配置是否正确,以确保开发环境的稳定性。 ... [详细]
  • 通过将常用的外部命令集成到VSCode中,可以提高开发效率。本文介绍如何在VSCode中配置和使用自定义的外部命令,从而简化命令执行过程。 ... [详细]
  • 卓盟科技:动态资源加载技术的兼容性优化与升级 | Android 开发者案例分享
    随着游戏内容日益复杂,资源加载过程已不仅仅是简单的进度显示,而是连接玩家与开发者的桥梁。玩家对快速加载的需求越来越高,这意味着开发者需要不断优化和提升动态资源加载技术的兼容性和性能。卓盟科技通过一系列的技术创新,不仅提高了加载速度,还确保了不同设备和系统的兼容性,为用户提供更加流畅的游戏体验。 ... [详细]
  • 深入解析 Android 中 EditText 的 getLayoutParams 方法及其代码应用实例 ... [详细]
  • 在使用SSH框架进行项目开发时,经常会遇到一些常见的问题。例如,在Spring配置文件中配置AOP事务声明后,进行单元测试时可能会出现“No Hibernate Session bound to thread”的错误。本文将详细探讨这一问题的原因,并提供有效的解决方案,帮助开发者顺利解决此类问题。 ... [详细]
  • Java测试服务器调试指南详细介绍了如何进行远程调试,并深入解析了Java Xdebug参数的使用方法。本文首先概述了Java内置的调试功能,重点介绍了JDB这一类似于GDB的强大调试工具。通过实例演示,读者可以掌握在测试环境中高效调试Java应用程序的技巧,包括配置远程调试环境和优化调试参数,以提高开发效率和代码质量。 ... [详细]
  • 本文详细介绍了如何在Java Web服务器上部署音视频服务,并提供了完整的验证流程。以AnyChat为例,这是一款跨平台的音视频解决方案,广泛应用于需要实时音视频交互的项目中。通过具体的部署步骤和测试方法,确保了音视频服务的稳定性和可靠性。 ... [详细]
  • 在Android 4.4系统中,通过使用 `Intent` 对象并设置动作 `ACTION_GET_CONTENT` 或 `ACTION_OPEN_DOCUMENT`,可以从相册中选择图片并获取其路径。具体实现时,需要为 `Intent` 添加相应的类别,并处理返回的 Uri 以提取图片的文件路径。此方法适用于需要从用户相册中选择图片的应用场景,能够确保兼容性和用户体验。 ... [详细]
author-avatar
滴答滴答箫雨伞_335
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有